package kusterordonio.dominio;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.*;

public class SistemaCarne implements Serializable {

    private ArrayList<Persona> listaMadres;
    private ArrayList<Persona> listaPadres;
    private ArrayList<Persona> listaTutores;
    private ArrayList<Persona> listaMedicos;
    private ArrayList<Ninio> listaNiños;
    
    public SistemaCarne(){
        listaMadres = new ArrayList<Persona>();
        listaPadres = new ArrayList<Persona>();
        listaTutores = new ArrayList<Persona>();
        listaMedicos = new ArrayList<Persona>();
        listaNiños = new ArrayList<Ninio>();
    }

    public ArrayList<Persona> getListaMadres() {
        return listaMadres;
    }

    public ArrayList<Persona> getListaMedicos() {
        return listaMedicos;
    }

    public ArrayList<Ninio> getListaNinios() {
        return listaNiños;
    }

    public ArrayList<Persona> getListaPadres() {
        return listaPadres;
    }

    public ArrayList<Persona> getListaTutores() {
        return listaTutores;
    }
    
    //Agregar a listas
    public void agregarPersona(ArrayList<Persona> lista, Persona unaP){
        if (!lista.contains(unaP)){
                lista.add(unaP);
                Collections.sort(lista,new OrdenaPersonaPorApellidosNombre());
        }
    }
    
    //Método para agregar padre o madre
    public void agregarPadreMadreTutor(Persona unaP){
        if (unaP.isSexo())
            this.agregarPersona(this.getListaPadres(), unaP);
        else
            this.agregarPersona(this.getListaMadres(), unaP);
    }
    
    //Método para agregar un Ninio
    public void agregarNinio(Ninio unN){
        if (!this.getListaNinios().contains(unN)){
                listaNiños.add(unN);
                Collections.sort(this.getListaNinios(),new OrdenaPersonaPorApellidosNombre());
        }
    }
    
    //Método para verificar si existe una persona en una lista
    public boolean existePersona(ArrayList<Persona> lista, String unaCI){
        boolean existe;
        Persona p = new Persona();
        p.setCedulaId(unaCI);
        if (lista.contains(p))
            existe = true;
        else
            existe = false;
        return existe;
    }
    
    //Método que devuelve la lista de hijos de una persona
    public ArrayList<Ninio> listaHijos(String unaCI){
        ArrayList<Ninio> listaHijos = new ArrayList<Ninio>();
        Persona p = new Persona();
        p.setCedulaId(unaCI);
        for(int i=0; i< listaNiños.size(); i++){ 
            Ninio niño = listaNiños.get(i);
            if(niño.getMadre()!= null && niño.getMadre().getCedulaId().equals(unaCI)){
                listaHijos.add(listaNiños.get(i));
            }
            if(niño.getPadre()!= null && niño.getPadre().getCedulaId().equals(unaCI)){
                listaHijos.add(listaNiños.get(i));
            }
            if(niño.getTutor()!= null && niño.getTutor().getCedulaId().equals(unaCI)){
                listaHijos.add(listaNiños.get(i));
            }
        }
        return listaHijos;
    } 
    
    //Método de control de ingreso de entero
    public boolean controlEnteroPos(String unValor){
        //variable para controlar si se ingresa un entero
        boolean entero = true;
        boolean positivo = false;
        int valor=0;
        try{
            valor = Integer.parseInt(unValor);
        }
        catch(Exception e){
            entero = false;
        }
        if(entero && valor> 0) positivo = true;
            return positivo;
    }//fin controlEnteroPos
    
    //Método de control de ingreso de entero incluyendo el 0
    public boolean controlEnteroCero(String unValor){
        //variable para controlar si se ingresa un entero
        boolean entero = true;
        boolean positivo = false;
        int valor=0;
        try{
            valor = Integer.parseInt(unValor);
        }
        catch(Exception e){
            entero = false;
        }
        if(entero && valor>= 0) positivo = true;
            return positivo;
    }//fin controlEnteroPos

    //Método de control de ingreso de double
    public boolean controlDoublePos(String unValor){
        //variable para controlar si se ingresa un double
        boolean numero = true;
        boolean positivo = false;
        double valor=0;
        try{
            valor = Double.parseDouble(unValor);
        }
        catch(Exception e){
            numero = false;
        }
        if(numero && valor> 0) positivo = true;
            return positivo;
    }//fin controlDoublePos
    
    //Controla que unaFecha sea mayor a la de hoy
    public boolean controlFechaMayorHoy(Date unaFecha){
        return (unaFecha.after(Calendar.getInstance().getTime()));
    }
    
    //Controla que unaFecha sea mayor a otraFecha
    public boolean comparaFechas(Date unaFecha, Date otraFecha){
        Boolean posterior = false;
        if (unaFecha.after(otraFecha))
            posterior = true;
        return posterior;
    }
    
    //Calcula la distancia en días entre dos fechas
    public int calculoDiasEntreFechas(Date unaFecha, Date otraFecha){
        //Convierte la diferencia entre una fecha y otra de milisegundos(long) a días(int)
        int dias1 = (((int)(unaFecha.getTime()))/(1000*3600*24)+1);
        int dias2 = (((int)(otraFecha.getTime()))/(1000*3600*24)+1);        
        return dias1 - dias2;
    }
    
    //Pre: La persona existe
    //Pos: devuelve una persona recibiendo la cédula como parámetro
    public Persona devuelvePersona(String cedula){
        Persona persona = new Persona();
        if (existePersona(listaMedicos,cedula)){
            for(int i=0; i<listaMedicos.size(); i++){
                if(listaMedicos.get(i).getCedulaId().equals(cedula)){
                   return listaMedicos.get(i);
                }
            }
        }
        if (existePersona(listaMadres,cedula)){
            for(int i=0; i<listaMadres.size(); i++){
                if(listaMadres.get(i).getCedulaId().equals(cedula)){
                   return listaMadres.get(i);
                }
            }
        }
        if (existePersona(listaPadres,cedula)){
            for(int i=0; i<listaPadres.size(); i++){
                if(listaPadres.get(i).getCedulaId().equals(cedula)){
                   return listaPadres.get(i);
                }
            }
        }
        if (existePersona(listaTutores,cedula)){
            for(int i=0; i<listaTutores.size(); i++){
                if(listaTutores.get(i).getCedulaId().equals(cedula)){
                   return listaTutores.get(i);
                }
            }
        }
        return persona;
    }
    
    //genera el archivo de serializacion
        public void serializar(SistemaCarne unSistema){
            try{
                ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("serializa.ps"));
                out.writeObject(unSistema);
                out.close();
            }
            catch(Exception e){
                System.out.println("No se ha generado el archivo de serialización");
            }
	}//fin serializar
    
}
